package com.example.myapplication;

import android.content.Context;
import android.content.Intent;

import com.example.myapplication.logs.LogDatabase;
import com.example.myapplication.logs.LogDao;
import com.example.myapplication.logs.PowerEvent;

import java.util.List;
import java.util.concurrent.Executors;

/**
 * 机器人管理API - 主要接口类，用于AAR集成
 * 提供开机时长统计、浏览信息、开关机信息、设置使用时长、禁用话题、密码设置等功能
 */
public class RobotManager {
    private static RobotManager instance;
    private final Context context;
    private final UptimeStatsService uptimeStatsService;
    private final LogDao logDao;

    private RobotManager(Context context) {
        this.context = context.getApplicationContext();
        this.uptimeStatsService = new UptimeStatsService(this.context);
        this.logDao = LogDatabase.get(this.context).logDao();
    }

    /**
     * 获取RobotManager单例实例
     * @param context 应用上下文
     * @return RobotManager实例
     */
    public static synchronized RobotManager getInstance(Context context) {
        if (instance == null) {
            instance = new RobotManager(context);
        }
        return instance;
    }

    // ==================== 开机时长统计相关 ====================

    /**
     * 获取当前开机时长（毫秒）
     * @return 开机时长，如果未找到开机记录则返回-1
     */
    public long getCurrentUptime() {
        return uptimeStatsService.getCurrentUptime();
    }

    /**
     * 获取开机时间（计算得出）
     * @return 开机时间戳
     */
    public long getBootTime() {
        return uptimeStatsService.getBootTime();
    }

    /**
     * 格式化时长显示
     * @param milliseconds 毫秒数
     * @return 格式化的时长字符串
     */
    public String formatUptime(long milliseconds) {
        return UptimeStatsService.formatUptime(milliseconds);
    }



    // ==================== 浏览信息相关 ====================

    /**
     * 记录浏览事件
     * @param url 浏览的URL
     * @param title 页面标题
     */
    public void logBrowseEvent(String url, String title) {
        com.example.myapplication.logs.BrowseEvent event = new com.example.myapplication.logs.BrowseEvent();
        event.timestamp = System.currentTimeMillis();
        event.url = url;
        event.title = title;
        
        Executors.newSingleThreadExecutor().execute(() ->
                logDao.insertBrowse(event)
        );
    }

    /**
     * 获取最近的浏览记录
     * @return 浏览事件列表
     */
    public List<com.example.myapplication.logs.BrowseEvent> getRecentBrowseEvents() {
        return logDao.getRecentBrowse();
    }

    // ==================== 开关机信息相关 ====================

    /**
     * 记录开机事件
     */
    public void logBootEvent() {
        PowerEvent event = new PowerEvent();
        event.timestamp = System.currentTimeMillis();
        event.type = "boot";
        
        Executors.newSingleThreadExecutor().execute(() ->
                logDao.insertPower(event)
        );
    }

    /**
     * 记录关机事件
     */
    public void logShutdownEvent() {
        PowerEvent event = new PowerEvent();
        event.timestamp = System.currentTimeMillis();
        event.type = "shutdown";
        
        Executors.newSingleThreadExecutor().execute(() ->
                logDao.insertPower(event)
        );
    }

    /**
     * 获取最近的电源事件记录
     * @return 电源事件列表
     */
    public List<PowerEvent> getRecentPowerEvents() {
        return logDao.getRecentPower();
    }

    // ==================== 聊天消息相关 ====================

    /**
     * 记录聊天消息
     * @param content 消息内容
     * @param topic 话题/发送者
     */
    public void logChatMessage(String content, String topic) {
        com.example.myapplication.logs.ChatMessage chatMessage = new com.example.myapplication.logs.ChatMessage();
        chatMessage.timestamp = System.currentTimeMillis();
        chatMessage.content = content;
        chatMessage.topic = topic;
        
        Executors.newSingleThreadExecutor().execute(() ->
                logDao.insertChat(chatMessage)
        );
    }

    /**
     * 获取最近的聊天记录
     * @return 聊天消息列表
     */
    public List<com.example.myapplication.logs.ChatMessage> getRecentChatMessages() {
        return logDao.getRecentChat();
    }

    // ==================== 固件更新相关 ====================


    /**
     * 启动应用使用统计界面
     */
    public void openAppUsageActivity() {
        Intent intent = new Intent(context, AppUsageActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    /**
     * 启动设备开关机信息界面
     */
    public void openDevicePowerInfoActivity() {
        Intent intent = new Intent(context, DevicePowerInfoActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    /**
     * 获取设备开关机信息
     * @return 设备电源信息对象
     */
    public DevicePowerInfoService.DevicePowerInfo getDevicePowerInfo() {
        DevicePowerInfoService service = new DevicePowerInfoService(context);
        return service.getDevicePowerInfo();
    }

    /**
     * 启动系统控制界面
     */
    public void openSystemControlActivity() {
        Intent intent = new Intent(context, SystemControlActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    // ==================== 系统控制相关 ====================

    /**
     * 关闭屏幕
     * @return 操作结果
     */
    public SystemControlService.SystemControlResult turnOffScreen() {
        SystemControlService service = new SystemControlService(context);
        return service.turnOffScreen();
    }

    /**
     * 开启屏幕
     * @return 操作结果
     */
    public SystemControlService.SystemControlResult turnOnScreen() {
        SystemControlService service = new SystemControlService(context);
        return service.turnOnScreen();
    }

    /**
     * 重启设备
     * @return 操作结果
     */
    public SystemControlService.SystemControlResult rebootDevice() {
        SystemControlService service = new SystemControlService(context);
        return service.rebootDevice();
    }

    /**
     * 关机设备
     * @return 操作结果
     */
    public SystemControlService.SystemControlResult shutdownDevice() {
        SystemControlService service = new SystemControlService(context);
        return service.shutdownDevice();
    }

    /**
     * 安装APK文件
     * @param apkFilePath APK文件路径
     * @return 操作结果
     */
    public SystemControlService.SystemControlResult installApk(String apkFilePath) {
        SystemControlService service = new SystemControlService(context);
        return service.installApk(apkFilePath);
    }

    /**
     * 获取系统信息
     * @return 系统信息对象
     */
    public SystemControlService.SystemInfo getSystemInfo() {
        SystemControlService service = new SystemControlService(context);
        return service.getSystemInfo();
    }

    /**
     * 检测设备是否具有root权限
     * @return 是否具有root权限
     */
    public boolean hasRootPermission() {
        SystemControlService service = new SystemControlService(context);
        return service.hasRootPermission();
    }

    // ==================== 设备数据上传相关 ====================
    
    private DeviceDataCollector deviceDataCollector;
    private DeviceDataUploader deviceDataUploader;
    
    /**
     * 获取设备数据收集器
     * @return DeviceDataCollector实例
     */
    public DeviceDataCollector getDeviceDataCollector() {
        if (deviceDataCollector == null) {
            deviceDataCollector = new DeviceDataCollector(context);
        }
        return deviceDataCollector;
    }
    
    /**
     * 获取设备数据上传器
     * @return DeviceDataUploader实例
     */
    public DeviceDataUploader getDeviceDataUploader() {
        if (deviceDataUploader == null) {
            deviceDataUploader = new DeviceDataUploader(context);
        }
        return deviceDataUploader;
    }
    
    /**
     * 获取设备数据配置
     * @return DeviceDataConfig实例
     */
    public DeviceDataConfig getDeviceDataConfig() {
        return getDeviceDataCollector().getConfig();
    }
    
    /**
     * 收集所有设备数据
     * @return 设备数据模型
     */
    public DeviceDataModel collectAllDeviceData() {
        return getDeviceDataCollector().collectAllData();
    }
    
    /**
     * 收集并上传设备数据（异步）
     * @param callback 上传回调
     */
    public void uploadDeviceData(DeviceDataUploader.UploadCallback callback) {
        DeviceDataModel data = collectAllDeviceData();
        getDeviceDataUploader().uploadData(data, callback);
    }
    
    /**
     * 收集并上传设备数据（同步）
     * @return 上传结果
     */
    public DeviceDataUploader.UploadResult uploadDeviceDataSync() {
        DeviceDataModel data = collectAllDeviceData();
        return getDeviceDataUploader().uploadDataSync(data);
    }
    
    /**
     * 上传指定的设备数据（异步）
     * @param data 设备数据模型
     * @param callback 上传回调
     */
    public void uploadDeviceDataWithModel(DeviceDataModel data, DeviceDataUploader.UploadCallback callback) {
        getDeviceDataUploader().uploadData(data, callback);
    }
    
    /**
     * 上传指定的设备数据（同步）
     * @param data 设备数据模型
     * @return 上传结果
     */
    public DeviceDataUploader.UploadResult uploadDeviceDataSyncWithModel(DeviceDataModel data) {
        return getDeviceDataUploader().uploadDataSync(data);
    }

    // ==================== 工具方法 ====================

    /**
     * 获取数据库实例（用于高级操作）
     * @return LogDatabase实例
     */
    public LogDatabase getDatabase() {
        return LogDatabase.get(context);
    }


    /**
     * 获取开机时长统计服务实例（用于高级操作）
     * @return UptimeStatsService实例
     */
    public UptimeStatsService getUptimeStatsService() {
        return uptimeStatsService;
    }
}
